const mongoose = require("mongoose");
const schedule = require('node-schedule');

const Notice = mongoose.model("notice");

/**
 * 定时通知扫描
 */
const jobs = new Map();

async function scanNotice() {
    try {
        // 获取所有的通知
        const notices = await Notice.find({
            $or: [
                {noticeType: '0'}, // 通知类型为定时
                {
                    noticeType: '2', // 通知类型为定期
                    noticeBeginTime: {$lte: new Date()}, // 开始时间在当前时间之前
                    noticeEndTime: {$gte: new Date()} // 结束时间在当前时间之后
                }
            ]
        });

        // 创建一个Set，包含所有通知的ID
        const noticeIds = new Set(notices.map(notice => String(notice._id)));

        // 取消已经删除的通知的定时任务
        for (const [id, job] of jobs) {
            if (!noticeIds.has(id)) {
                job.cancel();
                jobs.delete(id);
            }
        }

        // 对于每个通知，如果它还没有对应的定时任务，或者它的cron表达式被修改了，就创建一个新的定时任务
        notices.forEach(notice => {
            const id = String(notice._id);
            if (notice.cron && (!jobs.has(id) || jobs.get(id).cron !== notice.cron)) { // 检查cron字段是否存在，以及是否已经有对应的定时任务，或者cron表达式是否被修改了
                if (jobs.has(id)) {
                    jobs.get(id).cancel(); // 如果已经有对应的定时任务，先取消它
                }
                const job = schedule.scheduleJob(notice.cron, () => {
                    console.log("执行通知任务");
                    // 在这里添加执行通知的代码
                });
                jobs.set(id, job); // 将新的定时任务添加到Map中
            }
        });
    } catch (error) {
        console.error('扫描通知时出错:', error);
    }
}

// 创建一个定时任务，每分钟执行一次scanNotice函数
schedule.scheduleJob('* * * * *', scanNotice);

/**
 * 定期任务扫描
 */


module.exports = {
    scanNotice
}
